package administracionDeMemoria;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Paint;
import java.awt.Shape;
import java.awt.geom.Area;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Line2D;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import java.util.Collection;
import java.util.ListIterator;
import javax.swing.JPanel;
import sun.java2d.loops.CompositeType;
import sun.java2d.loops.FillRect;
import sun.java2d.loops.SurfaceType;
/*
 * To change this template, choose Tools | Templates and open the template in
 * the editor.
 */

/**
 *
 * @author Miguel
 */
public class PnlMemoria extends JPanel {

    public static ArrayList<Shape> fijuras = new ArrayList<Shape>();
    public static ArrayList<Color> relleno = new ArrayList<Color>();
    public static ArrayList<Integer> size = new ArrayList<Integer>();
    boolean flagDesf = false;

    public PnlMemoria() {
    }

    @Override
    public void paint(Graphics g) {

        super.paint(g);
        Graphics2D a = (Graphics2D) g;



        for (int i = 0; i < fijuras.size(); i++) {

            //a.setColor(new Color((int)(Math.random()*256),(int)(Math.random()*256),(int)(Math.random()*256)));

            a.draw(fijuras.get(i));
        }

        for (int i = 0; i < relleno.size(); i++) {
            a.setColor(relleno.get(i));
            a.fill(fijuras.get(i));


        }




    }

    public void pintar(double x) {

        double coordenadaX = 12.5;
        double coordenadaY = 15;
        int contadorColumnas = 0;

        for (int i = 1; i <= x; i++) {

            fijuras.add(new Rectangle2D.Double(coordenadaX, coordenadaY, 50, 50));
            coordenadaX = coordenadaX + 65;
            contadorColumnas++;

            if (contadorColumnas == 8) {
                coordenadaY = coordenadaY + 60;
                coordenadaX = 12.5;
                contadorColumnas = 0;
            }

        }



    }

    public boolean rellenar(Color color, int size) {
        int contadorBloquesLibres = 0;
        int ocupar = size / 512;
        int residuo = size % 512;
        if (residuo != 0) {
            ocupar++;
        }
        for (int i = 0; i < relleno.size(); i++) {
            if (relleno.get(i).getAlpha() == 0) {
                contadorBloquesLibres++;
                if (contadorBloquesLibres == ocupar) {
                    for (int j = 0; j < ocupar; j++) {
                        relleno.remove(i - j);
                        relleno.add((i - j), color);
                    }
                    ocupar = 0;
                    return  true;
                }
            } else {
                contadorBloquesLibres = 0;
            }
        }
        int bloquesLibres = fijuras.size() - relleno.size();
        if(bloquesLibres < ocupar)
        {
          return false;
        }
        
        for (int i = 0; i < ocupar; i++) {
            relleno.add(color);
        }
        return true;

    }

    public void borrarBloque(Color color) {

        for (int i = 0; i < relleno.size(); i++) {
            if (relleno.get(i) == color) {
                relleno.remove(i);
                relleno.add(i, new Color(Color.OPAQUE, true));
            }
        }
        this.repaint();
    }
    public void desfragmentar()
    {
        flagDesf = false;
        int contadorBloquesEliminado = 0;
        for (int i = 0; i < relleno.size(); i++)
        {
            if (relleno.get(i).getAlpha() == 0) {
                relleno.remove(i);
                contadorBloquesEliminado++;
                return;
                }
        }
        if(contadorBloquesEliminado == 0)
        {
          flagDesf = true;
        }
    }
}
